home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
msdos
/
plotting
/
pcgplots
/
cgmdispl.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-24
|
9KB
|
244 lines
// C++ .h file for gplot, basic display classes -*-c++-*-
// copyright Phil Andrews, Pittsburgh Supercomputing Center, 1992
// all rights reserved
#ifndef cgmdisplay_h
#define cgmdisplay_h
#include <math.h>
#include <stdio.h>
#include "cgm.h"
////
// forward declarations
////
#ifndef _XLIB_H_
class XPoint;
#endif
// handy angle class, note completely defined by sin and cos, thus no
// concept of "less than", no cuts or Riemann sheets. Inline everything.
////
class angle {
public:
// constructor
angle(double y, double x)
{r = sqrt(x*x + y*y); myTan = (x) ? y/x : (y<0) ? tanMax : -tanMax;
mySin = (r) ? y/r : 0; myCos = (r) ? x/r : 0;}
double tan() const {return myTan;}
double sin() const {return mySin;}
double cos() const {return myCos;}
////
// in this range ? (i.e., going from phi1 to phi2 covers *this)
int within(angle phi1, angle phi2)
{return (((*this - phi1).sin() >= 0) && ((phi2 - *this).sin() >= 0));}
////
// now some overloaded operators
// minus another angle
angle operator-(angle phi) const
{return angle(sin() * phi.cos() - cos() * phi.sin(),
cos() * phi.cos() + sin() * phi.sin());}
// plus another angle
angle operator+(angle phi) const
{return angle(sin() * phi.cos() + cos() * phi.sin(),
cos() * phi.cos() - sin() * phi.sin());}
////
// decrement operator
angle operator-=(angle phi)
{double y = sin() * phi.cos() - cos() * phi.sin();
double x = cos() * phi.cos() + sin() * phi.sin();
mySin = y; myCos = x; myTan = (x) ? y/x : (y<0) ? -tanMax : tanMax;
return *this;}
////
// increment operator
angle operator+=(angle phi)
{double y = sin() * phi.cos() + cos() * phi.sin();
double x = cos() * phi.cos() - sin() * phi.sin();
mySin = y; myCos = x; myTan = (x) ? y/x : (y<0) ? -tanMax : tanMax;
return *this;}
////
double size() {return r;} // careful with this !
protected:
double myTan, mySin, myCos, r;
static const double tanMax;
};
////
// base display class
////
class baseDisplay {
public:
baseDisplay(); // default constructor
virtual ~baseDisplay() {if (myPxlExtent) delete myPxlExtent;}
////
// delimiters
virtual void newMF(){} // default
void newPic(); // not virtual, must be calle
virtual void startPic() {} // default function
void newPicBody(float, float, float=0, float=0); // not virtual, must call
virtual void clearScreen(const char* = NULL){} // default function
virtual void endPic(){} // default function
virtual void endMF(){} // default function
////
// control elements, all default
virtual void transparency(int inTrans) {myTrans = inTrans;}
virtual void clipRect(const vdcPts *inPts) {myClipRect = inPts;}
virtual void clip(int inClip) {myClip = inClip;}
virtual void backColr(const genColr&) {}
////
// graphical primitives, polyline required rest default
virtual int polyline(const vdcPts*) = 0; // required in all descendants
virtual int disPolyline(const vdcPts*); // default function
virtual int polymarker(const vdcPts*); // default function
virtual int text(const genText*); // default function
virtual int polygon(const vdcPts*); // default function
virtual int polygonSet(const vdcPts*, const int*); // default function
virtual int cells(const cellArray*); // default function
virtual int rectangle(const vdcPts*); // default function
virtual int circle(const vdcPts*, const vdc*, int=0); // default function
virtual int arc3Pt(const vdcPts*, int); // default function
virtual int arcCtr(const vdcPts*, vdc*, int); // default function
virtual int ellipse(const vdcPts*); // default function
virtual int ellipArc(const vdcPts*, int); // default function
////
// attributes, all default functions
virtual void lineIndex(int inIndex) {myLineIndex = inIndex;}
virtual void lineType(int inType) {myLineType = inType;}
virtual void lineWidth(const vdcR *inWidth) {myLineWidth = inWidth;}
virtual void lineColr(const genColr &inColr) {}
virtual void markerIndex(int inIndex) {myMarkerIndex = inIndex;}
virtual void markerType(int inType) {myMarkerType = inType;}
virtual void markerSize(const vdcR *inSize) {myMarkerSize = inSize;}
virtual void markerColr(const genColr &inColr) {}
virtual void textIndex(int inIndex) {myTextIndex = inIndex;}
virtual void fontIndex(int inIndex) {myFontIndex = inIndex;}
virtual void textPrec(int inType) {myTextPrec = inType;}
virtual void charSpace(float inFloat) {myCharSpace = inFloat;}
virtual void charExpan(float inFloat) {myCharExpan = inFloat;}
virtual void textColr(const genColr&) {}
virtual void charHeight(const vdc *inHeight) {myCharHeight = inHeight;}
virtual void charOri(const vdcPts *inOri) {myCharOri = inOri;}
virtual void textPath(int inPath) {myTextPath = inPath;}
virtual void textAlign(const alignment *inAlign) {myTextAlign = inAlign;}
virtual void charSetIndex(int inIndex) {myCharSetIndex = inIndex;}
virtual void altCharSetIndex(int inIndex) {myAltCharSetIndex = inIndex;}
virtual void fillIndex(int inIndex) {myFillIndex = inIndex;}
virtual void intStyle(int inStyle) {myIntStyle = inStyle;}
virtual void fillColr(const genColr&){}
virtual void hatchIndex(int inIndex) {myHatchIndex = inIndex;}
virtual void patIndex(int inIndex) {myPatIndex = inIndex;}
virtual void edgeIndex(int inIndex) {myEdgeIndex = inIndex;}
virtual void edgeType(int inType) {myEdgeType = inType;}
virtual void edgeWidth(const vdcR *inWidth) {myEdgeWidth = inWidth;}
virtual void edgeVis(int inVis) {myEdgeVis = inVis;}
virtual void edgeColr(const genColr &inColr) {}
virtual void fillRefPt(const vdcPts *inPts) {myFillRefPt = inPts;}
virtual void colrs(const colrTable*); // a colour table
////
// check on requirements of display
virtual int invert() {return 0;} // do we need inversion of vdc pts ?
virtual int picDefaults() {return 1;} // do we need defaults for each page
virtual int fileDefaults() {return 0;} // do we need defaults for each file
protected:
// utility functions
int getSize(const vdc *inVDC) // size in x pixels
{return (inVDC) ? (inVDC->type()) ? (int) (inVDC->f() * useScale) :
(int) (inVDC->i() * useScale) : 0;}
int getPts(const vdcPts*, int*&, int=0); // get right format of points
int getPts(const vdcPts*, float*&, int=0); // get right format of points
int getPts(const vdcPts*, short*&, int=0); // get right format of points
int getPts(const vdcPts*, XPoint*&, int=0); // get right format of points
vdcPts *getArc(const vdcPts*, const vdc*, const angle*, const angle*,
int=-1, const vdc* = NULL, const angle* = NULL);
float greyColr(float r, float g, float b) // grey equivalent
{return 1.0 - (0.3 * r + 0.59 * g + 0.11 * b);}
float greyColr(float *inF) // convenience function
{return greyColr(inF[0], inF[1], inF[2]);}
////
virtual vdcPts *pxlExtent() {return myPxlExtent;} // pixel extent
virtual float xPxlSize() = 0; // x pixel size in mm (required)
virtual float yPxlSize() = 0; // y pixel size in mm (required)
// state variables
//
// variables for scaling
float vdcWidth, vdcHeight, devWidth, devHeight, xScale, yScale, useScale;
float useOff[4];
// control elements
int myTrans;
const vdcPts *myClipRect;
int myClip;
//
// attributes
int myLineIndex;
int myLineType;
const vdcR *myLineWidth;
int myMarkerIndex;
int myMarkerType;
const vdcR *myMarkerSize;
int myTextIndex;
int myFontIndex;
int myTextPrec;
float myCharExpan;
float myCharSpace;
const vdc *myCharHeight;
const vdcPts *myCharOri;
int myTextPath;
const alignment *myTextAlign;
int myCharSetIndex;
int myAltCharSetIndex;
int myFillIndex;
int myIntStyle;
int myHatchIndex;
int myPatIndex;
int myEdgeIndex;
int myEdgeType;
const vdcR *myEdgeWidth;
int myEdgeVis;
const vdcPts *myFillRefPt;
// externally imposed values
int myXSize, myYSize;
vdcPts *myPxlExtent;
};
////
// class to hold a character in an Hershey font form
////
class hersheyChar {
public:
hersheyChar(const genText*, int, int=0);
~hersheyChar();
hersheyChar *next;
int display(baseDisplay*);
void shift(float&, float&);
float shift1() {return myShift1;}
float shift2() {return myShift2;}
float shiftY1() {return myShiftY1;}
float shiftY2() {return myShiftY2;}
float width() {return shift1() + shift2();}
float height() {return myHeight;}
float depth() {return myDepth;}
void scale(float);
protected:
vdcPts *contents;
static const int maxOffset;
void addPts(vdcPts*);
float myShift1, myShift2, myHeight, myDepth, myShiftY1, myShiftY2;
};
////
// class to hold a string in an Hershey font form
////
class hersheyString {
public:
hersheyString(const genText*);
~hersheyString();
int display(baseDisplay*);
void right(const genText*, float&, float&);
void left(const genText*, float&, float&);
void up(const genText*, float&, float&);
void down(const genText*, float&, float&);
float width(); // the width of the string
void scale(float); // scale the string
float height() {return myHeight;}
float depth() {return myDepth;}
protected:
hersheyChar *contents;
void addChar(hersheyChar*);
float myHeight, myDepth;
};
#endif // cgmdisplay_h